% -*- program: xelatex -*-
\documentclass[12pt]{beamer} 
%\usepackage{beamerthemesplit}

\usepackage{fontspec} 
\setsansfont{PT Sans} 
\setmonofont{PT Mono} 

\usepackage{beamerthemesplit}
\usefonttheme[onlymath]{serif}

\usetheme{CambridgeUS}
\usecolortheme{lily}  
 
\hypersetup{unicode=true} 
\DeclareFontEncoding{T1} 
\fontencoding{T1}
\usepackage[russian]{babel}

\usepackage{amsmath,amssymb,amsthm}
\usepackage{graphics,graphicx}
\usepackage{listings}
%\usepackage{media9}
\usepackage{fancyvrb} 
\usepackage{booktabs}  
\usepackage{colortbl}
\usepackage{multirow}
\usepackage{verbatim}
%\usepackage{fancyvrb}
\usepackage{color}
\usepackage{url} 
\usepackage{qrcode}
\usepackage{pifont}% http://ctan.org/pkg/pifont


\definecolor{mygreen}{RGB}{28,172,0} % color values Red, Green, Blue
\definecolor{mylilas}{RGB}{170,55,241}
\definecolor{codecolor}{RGB}{0,120,0}
\definecolor{light-gray}{gray}{0.95}
\definecolor{light-green}{RGB}{205,255,204}
\definecolor{light-red}{rgb}{0.9, 0.8, 0.8}
\definecolor{light-yellow}{rgb}{1,1,0.95}
\definecolor{light-blue}{RGB}{255,204,153}
\definecolor{dark-blue}{rgb}{0,0,0.6}
\definecolor{dark-red}{RGB}{204,0,0}
\definecolor{dark-green}{RGB}{28,172,0}

\newcommand{\cmark}{\textcolor{green}{\ding{51}}}
\newcommand{\xmark}{\textcolor{red}{\ding{55}}}

\setbeamercolor{frametitle}{fg=dark-red,bg=gray!10}
\setbeamerfont{title}{series=\bfseries,parent=structure}
\setbeamerfont{frametitle}{series=\bfseries,parent=structure}
\setbeamertemplate{blocks}[rounded][shadow=false]
\setbeamercolor{block title}{fg=structure,bg=white}
\setbeamertemplate{navigation symbols}{}

\renewcommand{\emph}[1]{\textcolor{dark-blue}{#1}}
\newcommand{\emphb}[1]{\textcolor{dark-blue}{\textbf{#1}}}

\usepackage{tikz}
\usetikzlibrary{er,arrows,matrix,positioning,shapes,snakes}
\usetikzlibrary{calc,patterns,decorations.pathmorphing,decorations.markings,positioning}
\usetikzlibrary{arrows,matrix,positioning,decorations,snakes}
\colorlet{myRed}{red!20}
\tikzset{
  rows/.style 2 args={/utils/temp/.style={row ##1/.append style={nodes={#2}}},
    /utils/temp/.list={#1}},
  columns/.style 2 args={/utils/temp/.style={column ##1/.append style={nodes={#2}}},
    /utils/temp/.list={#1}}}
\makeatletter
\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax,
  add font/.code=%
    \expandafter\def\expandafter\tikz@textfont\expandafter{\tikz@textfont#1},
  left delimiter/.style 2 args={append after command={\tikz@delimiter{south east}
    {south west}{every delimiter,every left delimiter,#2}{south}{north}{#1}{.}{\pgf@y}}}}
\makeatother

%\warn{\matcode}[1]{ \textcolor{codecolor}{\texttt{#1}}}
%\newcommand{\matcode}[1]{\begin{Verbatim}[formatcom=\color{red}]#1\end{Verbatim}}
\definecolor{codecolor}{RGB}{0,150,0}
\newcommand{\matcode}[1]{ \textcolor{codecolor}{\texttt{#1}}}

\newcommand{\imgsrc}[1]{  
\begin{tikzpicture}[remember picture,overlay]
  \node[anchor=north, rotate=90, inner sep=0.5pt] at (current page.west) {\fontsize{5}{6}\selectfont \textcolor{light-gray}{#1}};
\end{tikzpicture}
}

\title{Основы NoSQL}
\subtitle{Базы данных}
\author[Кафедра ММЭ]{Юдинцев В. В.}
\institute[Самарский университет]{Кафедра математических методов в экономике}

%\pgfdeclareimage[height=1cm]{logo}{ssau.pdf}
%\logo{\pgfuseimage{logo}}
%\setbeameroption{show notes}
%\graphicspath{{img/}}
 
%\usepackage[cache=false]{minted} 
\usepackage{minted} 
\usepackage{mdframed}  
\surroundwithmdframed{minted}
\mdfsetup{backgroundcolor=white,innerleftmargin=0.1cm,innerrightmargin=0.1cm,linecolor=light-gray,linewidth=0.0,skipabove=1mm,skipbelow=1cm,innerbottommargin=2mm}

\setminted[python]{fontsize=\scriptsize,encoding=utf8,breaklines=true}
\setminted[json]{fontsize=\scriptsize,encoding=utf8,breaklines=true}


% frame=lines,framesep=2\fboxsep
\makeatletter
\AtBeginEnvironment{minted}{\dontdofcolorbox}
\def\dontdofcolorbox{\renewcommand\fcolorbox[4][]{##4}}
\makeatother


\makeatother
\setbeamertemplate{footline}
{
  \leavevmode%
  \hbox{%  
  \begin{beamercolorbox}[wd=.3\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot}%
    \usebeamerfont{author in head/foot}\insertshortauthor
  \end{beamercolorbox}%  
  \begin{beamercolorbox}[wd=.6\paperwidth,ht=2.25ex,dp=1ex,center]{title in head/foot}%
    \usebeamerfont{title in head/foot}\insertshorttitle
  \end{beamercolorbox}%
  \begin{beamercolorbox}[wd=.1\paperwidth,ht=2.25ex,dp=1ex,center]{date in head/foot}%
  \insertframenumber{} / \inserttotalframenumber\hspace*{1ex}
% \insertframenumber{} 
  \end{beamercolorbox}}%
  \vskip0pt%
}

\setbeamertemplate{headline}{}
%\setbeamertemplate{footline}{1}

\AtBeginSection[]{ 
  \begin{frame}[plain]
  %\vfill  
  \begin{tikzpicture}
  \useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);  
  \fill[color=dark-red]   (-1cm, 3.9cm) rectangle(\the\paperwidth, 5.9cm);
 %\usebeamerfont{title}\insertsectionhead\par%
  %\node[text width=\the\paperwidth,align=center] at (current page.center) {\color{ExecusharesWhite}\Large\textbf{\insertsectionhead}};  
\node[text width=\the\paperwidth,align=center] at (6cm,4.9cm) {\color{white}\Large\textbf{\insertsectionhead}};
  \end{tikzpicture}
  \end{frame}
}

% 
% Документ
%
%
\begin{document}

{
\setbeamercolor{background canvas}{bg=white} 
\usebackgroundtemplate{\includegraphics[width=\paperwidth,height=\paperheight]{back.png}}
\begin{frame}[plain]
\maketitle
\end{frame}
}

\frame{
\frametitle{Содержание}
\tableofcontents
}

\section{Принципы NoSQL}

\begin{frame}
\frametitle{Реляционные базы данных}   
\begin{itemize}
  \item Каждая таблица состоит из строк
  \item Строки имеют фиксированное число полей (столбцов).
  \item Множественные значения полей и повторяющиеся группы значений недопустимы
  \item Строки таблицы отличаются друг от друга хотя бы единственным значением
  \item Столбцам таблицы присваиваются имена
  \item В каждом столбце размещаются однородные значения данных (даты, текст, целые числа, ...)
  \item[$\Rightarrow$] \alert{Структура данных чётко определена} 
\end{itemize}
\end{frame}

\begin{frame}[c]
  \frametitle{Реляционные базы данных}
  \begin{itemize}
  \item Любые изменения в объектах нужно отражать в структуре таблиц
  \item Физическая структура данных не соответствует объектной модели приложения
  \end{itemize}
\end{frame}

% \begin{frame}[c]    
%   \frametitle{Ведомость}
%   \begin{figure}[htbp]
%   \centering
%   \includegraphics[width=0.7\textwidth]{Ведомость.jpg}
%   \end{figure}
% \end{frame}

\begin{frame}[plain,c]    
    \begin{figure}[htbp]
    \centering
    \includegraphics[width=0.9\textwidth]{exam_list.png}
    \end{figure}
\end{frame}
  
\begin{frame}[fragile]    
\frametitle{Целостность данных}
Таблица <<Результат экзамена>>:
\small
\begin{minted}{SQL}
CREATE TABLE exam_line
(
  exam_id BIGINT UNSIGNED NOT NULL, 
  student_id BIGINT UNSIGNED NOT NULL, 
  mark TINYINT UNSIGNED, 
FOREIGN KEY (student_id) REFERENCES students (id) 
  ON UPDATE CASCADE 
  ON DELETE CASCADE,
FOREIGN KEY (exam_id) REFERENCES exams (id) 
  ON UPDATE CASCADE,
  ON DELETE CASCADE
);
\end{minted}
\end{frame}

\begin{frame}
\frametitle{Принципы ACID}
Реляционные базы данных ориентируются на принципы \emphb{ACID}
\begin{itemize}
  \item \emphb{Атомарность / Atomicity} \\ Никакая транзакция не может быть зафиксирована частично 
  \item \emphb{Согласованность / Consistency} \\ Успешная транзакция фиксирует только допустимые результаты
  \item \emphb{Изолированность/ Isolation} \\ Одновременно выполняющиеся транзакции не влияют друг на друга
  \item \emphb{Стойкость / Durability} \\ Проблемы нижнего уровня, например проблемы с оборудованием сервера, не должны приводить к отмене (потере) подтверждённых транзакций
\end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Транзакция}
  \begin{columns}
  \column{0.4\linewidth}
  \includegraphics[width=1\linewidth]{Transaction.png}
  \column{0.6\linewidth}
  \emphb{Транзакция} -- минимальная логически осмысленная операция, которая имеет смысл и \alert{может быть совершена только полностью}
  \end{columns}
\end{frame} 

\begin{frame}
  \frametitle{Недостатки реляционных СУБД}   
  \begin{itemize}
    \item Реляционные СУБД хранят информацию "дисперсионно": данные о сущностях могут быть распределены по разным таблицам
    \item Реляционные СУБД эффективны при простых часто повторяющихся запросах при сложных запросах их производительность падает
    \item Реляционные СУБД изначально создавались для работы на одной машине (сервере) и плохо приспособлены для работы в кластере или облаке    
    \item \alert{Реляционные СУБД идеальны для работы со структурированными данными, структура которых не подвержена частым изменениям}.
  \end{itemize}
  \end{frame}


\begin{frame}
\frametitle{BIG DATA}
В современном мире постоянно возникают задачи, связанные с обработкой больших объемов данных и высокой нагрузкой 
\begin{itemize}
  \item \emphb{Объём} \\ 
  Объем данных большой, в сравнении с традиционными сценариями
  \item \emphb{Скорость} \\ 
  Новые данные поступают с большой скоростью
  \item \emphb{Разнообразие} \\
  Поступающие данные могут быть как структурированы, так и неструктурированными (информация не организована в заранее определенном порядке)
\end{itemize}  
\end{frame}

\begin{frame}
\frametitle{BIG DATA}
\begin{columns}
  \column{0.35\linewidth}
  \includegraphics[width=1\linewidth]{big_data.png}
  \column{0.65\linewidth}
\begin{itemize}
  \item Для обработки \emph{больших данных} необходимы новые подходы, позволяющие эффективно и оперативно извлекать и анализировать полезную информацию из непрерывно поступающих огромных объёмов
  \item В основе обработки \emph{больших данных} \emph{горизонтальная масштабируемость} -- возможность добавлять к системе новые узлы, серверы, процессоры для увеличения общей производительности  
\end{itemize}  
\end{columns}
\end{frame}

\begin{frame}
  \frametitle{Согласованность}
  \begin{columns}
  \column{0.4\linewidth}
  \includegraphics[width=0.8\linewidth]{4nodes.png}
  \column{0.6\linewidth}
  В распределенных системах обеспечивать согласованность становится сложнее и дороже.
  \begin{itemize}    
    \item Медленный сетевой обменом между различными узлами 
    \item Возможность отказа узлов     
  \end{itemize}  
  \end{columns}
\end{frame}


\begin{frame}
\frametitle{Нереляционные БД - Not Only Sql}   
\begin{itemize}
  \item Термин \emphb{NoSQL} был впервые применен в 1998 году Карло Строцци (Carlo Strozzi) в качестве названия для его небольшой реляционной СУБД, которая не использовала язык SQL для манипулирования данными
  \item С 2009 года термин \emphb{NoSQL} стал использоваться уже для обозначения растущего числа распределенных систем управления данными, которые отказывались от поддержки \emphb{ACID}-транзакций -- одного из ключевых принципов работы с реляционными базами данных
  \item  Основная причина отказа от \emphb{ACID}-транзакций -- сложность эффективной реализации транзакций в распределённой среде
\end{itemize}
\end{frame}

% \begin{frame}
%   \frametitle{Нереляционные БД - Not Only Sql}   
%   \begin{itemize}
%     \item Главной предпосылкой к появлению систем, относимых к NoSQL, послужила растущая потребность в горизонтальной масштабируемости приложений  
%     \item Большинство NoSQL-систем изначально проектировались и создавались для работы в распределенной среде
%   \end{itemize}
% \end{frame}


\begin{frame} 
  \frametitle{Теорема CAP}
  Теорема CAP (теорема Брюера): в любой реализации распределённых вычислений возможно обеспечить не более двух из трёх следующих свойств:
  \begin{itemize}
    \item \emphb{согласованность данных} -- во всех вычислительных узлах в один момент времени данные не противоречат друг другу;
    \item \emphb{доступность} -- любой запрос к распределённой системе завершается корректным откликом, однако без гарантии, что ответы всех узлов системы совпадают
    \item \emphb{устойчивость к разделению} -- расщепление распределённой системы на несколько изолированных секций не приводит к некорректности отклика от каждой из секций  
  \end{itemize}  
\end{frame}

\begin{frame}
\frametitle{Согласованность и доступность}    
\begin{columns}
\column{0.4\linewidth}
    \includegraphics[width=1\linewidth]{CAP.png}
\column{0.6\linewidth}
  \begin{itemize}
    \item Для распределенной сети серверов, обеспечивающих работу социальной сети, важна \emph{доступность}, ради которой можно пожертвовать строгой согласованностью 
    \item Для сети серверов, обеспечивающих банковские операции, важна \emph{согласованность}
  \end{itemize}
\end{columns}
\end{frame}


\begin{frame}
\frametitle{Согласованность данных в NoSQL}   
\begin{columns}
  \column{0.4\linewidth}
      \includegraphics[width=1\linewidth]{CAP.png}
  \column{0.6\linewidth}
  \begin{itemize}
  \item \emphb{NoSQL} базы данных обычно жертвуют \emph{строгой согласованностью} в пользу \emph{доступности} и устойчивости к разделению
  \item Наиболее часто \emphb{NoSQL}-системы поддерживают \emph{согласованность «в конечном счёте»}, гарантируя, что при отсутствии новых обновлений в течение некоторого времени все копии данных (реплики) станут согласованными
\end{itemize}
\end{columns}
\end{frame}


\begin{frame}
  \frametitle{Нереляционные БД}   
  \begin{itemize}
    \item \emphb{NoSQL} БД не следуют реляционной модели данных
    \item Не требуется нормализация данных
    \item Не требуется создание схемы данных (в некоторых \emphb{NoSQL} БД это возможно)
    \item Каждая \emphb{NoSQL} база данных реализует свой способ работы с данными (нет "стандартного" языка, подобного SQL)
  \end{itemize}
  \end{frame}

\begin{frame}
\frametitle{Виды NoSQL}   
\begin{itemize}
  \item Хранилище ключ-значение \\
  \emph{Redis}, \emph{MemcacheDB}
  \item Распределённое хранилище \\
  \emph{Cassandra}, \emph{HBase}
  \item Документо-ориентированные СУБД предназначены для хранения иерархических структур данных - документов \\
  \emph{MongoDB}, \emph{Couchbase}
  \item БД на основе графов \\
  \emph{OrientDB}, \emph{Neo4J}
\end{itemize}
\centering
\includegraphics[width=0.8\linewidth]{NoSQL_types.png}
\end{frame}


% \begin{frame}[fragile]
%   \frametitle{Хранение сущности в таблицах}
%   \begin{center}
%   \includegraphics[width=0.8\linewidth]{teachers3.png}
%   \end{center}
%   \end{frame}


\begin{frame}
  \frametitle{Ключ-значение}
  \begin{center}
    \includegraphics[width=0.8\linewidth]{KeyValue.PNG}    
  \end{center}
\end{frame}

  
  \begin{frame}[fragile]
  \frametitle{Документо-ориентированные СУБД}
  \begin{minted}{json}
  {
  name: "Садовский",
  superviser:
      {
       name: "Громов В. И.",
       position: "Профессор"
      },
  exam: 
     [
        {
         name: "Базы данных",
         date: "2020-06-20",
         mark: 5
        },
        {
         name: "Эконометрика",
         date: "2020-06-25",
         mark: 5
        }
     ]
  }
  \end{minted}
  \end{frame}
  
\begin{frame}[fragile]
\frametitle{Колоночные СУБД}
\begin{center}
  \includegraphics[width=1\linewidth]{HBase_Table.png}      
\end{center}
HBase:
\begin{minted}{python}
row = table.row('2017-00001')
print(row['personal:name'])
print(row['professional:physics'])
\end{minted}
\end{frame}



\begin{frame}
\frametitle{Пример представления БД в Neo4JS}
\begin{center}
  \includegraphics[width=0.8\linewidth]{neo4js.png}    
\end{center}
\end{frame}

\begin{frame}
\frametitle{PRO}   
\begin{itemize}
  \item[\cmark] Возможность хранения больших объемов \emph{разнородных данных} 
  \item[\cmark] Линейная масштабируемость – добавление новых узлов в кластер увеличивает общую производительность системы
  \item[\cmark] Простота использования
  \item[\cmark] Быстрая разработка (начало), низкий порог вхождения 
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{CONTRA}   
\begin{itemize}
  \item[\xmark] Нет готовой формальной теории проектирования БД
  \item[\xmark] Ограниченная емкость встроенного языка запросов 
  \item[\xmark] Разрабатываемое приложение привязано к выбранной БД (следствие отсутствия стандарта)
  \item[\xmark] Сложности в поддержке всех ACID-требований к транзакциям 
  \item[\xmark] Небольшое количество высококвалифицированных <<нестандартных>> специалистов, приводит к необходимости освоению технологий <<в бою>>
\end{itemize}
\end{frame}


\begin{frame}[t]
  \frametitle{Область применения}   
  \begin{columns}[t]
    \column{0.5\linewidth}
    SQL
    \vspace{5mm}
    \begin{itemize}
      \item Бухгалтерские, финансовые и банковские системы
      \item Системы управления запасами
      \item Системы управления транзакциями  
    \end{itemize}
    \column{0.5\linewidth}
    NoSQL
    \vspace{5mm}
    \begin{itemize}
      \item Мобильные приложения
      \item Аналитика в реальном времени
      \item Управление содержимым
      \item Приложения Интернета вещей
    \end{itemize}
  \end{columns}
\end{frame}

\section{REDIS}

\begin{frame}
  \frametitle{REDIS}
  \begin{columns}
  \column{0.5\linewidth}
    \includegraphics[width=1\linewidth]{redis-logo.png}
  \column{0.5\linewidth}
      \emphb{Redis} (от англ. remote dictionary server) — система управления базами данных класса \emphb{NoSQL} с открытым исходным кодом, работающая со структурами данных "ключ-значение" 
\end{columns}
\end{frame}

\begin{frame}
\frametitle{REDIS}
\begin{itemize}    
    \item Данные хранятся в оперативной памяти, с возможностью периодической записи на диск, чем достигается высокая производительность, но повышается риск потери данных, если сбой сервера произошел до сохранения данных на диск 
    \item \alert{Объем данных, который может хранится на одном физическом сервере, ограничен объемом оперативной памяти на этом сервере} 
\end{itemize}
\imgsrc{Источник: \url{https://eax.me/redis/}}
\end{frame}

\begin{frame}
\frametitle{Применение}
\begin{itemize}
  \item \emphb{Redis} используется для хранения для быстроменяющихся активно запрашиваемых данных  
  \begin{itemize}
    \item Хранилище сессий и профилей пользователей
    \item Хранилище промежуточных результатов вычислений при обработке больших объемов данных
    \item СУБД для небольших приложений
  \end{itemize}   
  \item \emphb{Redis} используется в Tumblr, Disqus, Skype, StackOverflow, Instagram, GitHub, Flickr, Digg.
\end{itemize}
\imgsrc{Источник: \url{https://eax.me/redis/}}
\end{frame}

\begin{frame}
\frametitle{Типы данных}
\emphb{Redis} поддерживает пять типов данных: 
\begin{itemize}
  \item строка
  \item хэш 
  \item список
  \item множество 
  \item упорядоченное множество (zset)
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Типы данных}
\includegraphics[width=1\linewidth]{keyval.png}
\end{frame}


\begin{frame}[fragile]
\frametitle{Работа с Redis в Python}
\begin{minted}{python}
# Библиотека redis
import redis

# Создание подключения к серверу 192.168.0.11
r=redis.StrictRedis(host='192.168.0.11',charset="utf-8",
                    decode_responses=True)
\end{minted}

\end{frame}


\begin{frame}[fragile]
\frametitle{Строковые данные}
Добавление записи с ключом "NCC-1422" и строковым значением "USS Буран"
\begin{minted}{python}
r.set('NCC-1422','USS Буран')
\end{minted}
Извлечение записи по значению ключа
\begin{minted}{python}
r.get('NCC-1422')
\end{minted}
Результат работы функции
\begin{minted}{python}
'USS Буран'
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Множества}
Добавление элементов в множество \emphb{множество1} при помощи функции \emphb{sadd}
\begin{minted}{python}
r.sadd('множество1',1)
r.sadd('множество1',2)
r.sadd('множество1',3)
r.sadd('множество1',1)
\end{minted}
Для вывода элементов множества используется функция \emphb{smembers}
\begin{minted}{python}
r.smembers('множество1')
\end{minted}
Результат работы функции
\begin{minted}{python}
{'1', '2', '3'}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Операции с множествами: sdiff}
Добавление элементов в множество \emphb{множество2} 
\begin{minted}{python}
r.sadd('множество2',1)
r.sadd('множество2',2)
r.sadd('множество2',4)
r.sadd('множество2',5)
\end{minted}
Разница двух множеств (функция \emphb{sdiff})
\begin{minted}{python}
r.sdiff('множество2','множество1')
\end{minted}
Результат работы функции \emphb{sdiff}: элементы входящие в \emphb{множество2} множество, но не входящие в множество \emphb{множество1}:
\begin{minted}{python}
{'4', '5'}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Операции с множествами: sunion}
Объединение двух множеств
\begin{minted}{python}
r.sunion('множество2','множество1')
\end{minted}
Результат работы функции \emphb{sunion}:
\begin{minted}{python}
{'1', '2', '3', '4', '5'}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Операции с множествами: sismember}
Содержится ли элемент в множестве -- функция \emphb{sismember}:
\begin{minted}{python}
r.sismember('множество1','3')
\end{minted}
Результат работы функции \emphb{sismember}:
\begin{minted}{python}
True
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Хэши}
Хэши подобны словарям Python и хранят значения с ключами:
\begin{minted}{python}
r.hset('2018-00012','Фамилия','Лопотухин')
r.hset('2018-00012','Имя','Василий')
\end{minted}
Первый аргумент функции \emphb{hset} это имя хэша, второй -- имя ключа, третий -- значение.
Для того, чтобы прочитать значение ключа используется функция \emphb{hget}:
\begin{minted}{python}
r.hget('2018-00012','Фамилия')
\end{minted}
Результат
\begin{minted}{python}
'Лопотухин'
\end{minted}
Прочитать все пары ключ-значение из заданного хэша
\begin{minted}{python}
r.hgetall('2018-00012')
\end{minted}
Результат работы функции \emphb{hgetall}
\begin{minted}{python}
{'Фамилия': 'Лопотухин', 'Имя': 'Василий'}
\end{minted}  
\end{frame}

\begin{frame}[fragile]
\frametitle{Списки: lpush}
Добавление элемента в список \emph{ChandlersList} -- функция \emphb{lpush}:
\begin{minted}{python}
r.lpush('ChandlersList','Kim Basinger', 
        'Cindy Crawford', 'Yasmine Bleeth')
\end{minted}
Вывод элементов списка \emph{ChandlersList} c \alert{0} до \alert{1} элемента включительно (первые два элемента)
\begin{minted}{python}
r.lrange('ChandlersList',0,1)

['Yasmine Bleeth', 'Cindy Crawford']
\end{minted}
Вывод содержимого списка \emph{ChandlersList} начиная с элемента \alert{0} до элемента \alert{-1} (первый с конца списка) -- вывод всех элементов списка
\begin{minted}{python}
r.lrange('ChandlersList',0,-1)

['Yasmine Bleeth', 'Cindy Crawford', 'Kim Basinger']
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Списки: linsert}
Вставить новый элемент в список \emph{ChandlersList} ПОСЛЕ (AFTER) заданного -- функция \emphb{linsert}:
\begin{minted}{python}
r.linsert('ChandlersList','AFTER','Yasmine Bleeth','Jessica Rabbit')
\end{minted}
Результат
\begin{minted}{python}
r.lrange('ChandlersList',0,-1)
  
['Yasmine Bleeth','Jessica Rabbit','Cindy Crawford','Kim Basinger']
\end{minted}
\end{frame}



\section{MongoDB}

\begin{frame}
\frametitle{MongoDB} 
\begin{columns}
\column{0.3\linewidth}   
\includegraphics[width=1\linewidth]{Mongo-db-logo.png}  
\column{0.7\linewidth} 
\begin{itemize}
  \item MongoDB предлагает документо-ориентированную модель данных
  \item Реляционные базы данных хранят строки, MongoDB -- \emphb{документы}
  \item Документы хранятся в формате \emphb{BSON}, представляющем собой расширенную версию текстового формата хранения структурированных данных -- \emphb{JSON}
\end{itemize}
\end{columns}
\imgsrc{Подробнее: \url{http://bsonspec.org}}
\end{frame}

\begin{frame}
\frametitle{JSON формат}
\begin{itemize}
  \item JSON -- \emphb{J}ava\emphb{S}cript \emphb{O}bject \emphb{N}otation — текстовый формат хранения структурированных данных   
  \item Элементы хранятся в формате \emph{ключ : значение}, разделяемые двоеточием
  \item Объект JSON начинается и заканчивается фигурными скобками 
  \item Формат удобночитаем и для машины и для человека
\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{Пример JSON-файла} 
\begin{minted}{json}
{
  "order_id": 11231,
  "date": "2020-05-01",
  "items": [
    {
    "good_id": 12,
    "good_count": 1,
    "good_cost": 12351.12
    },
    {
    "good_id": 15,
    "good_count": 2,
    "good_cost": 750.00
    }
    ],
  "client": 
  {
    "fname": "Gaius Baltar",
    "email": "GaiusBaltar@gmail.com"
  }
}
\end{minted}
\end{frame}

\begin{frame}
\frametitle{Область применения}
\begin{itemize}
  \item хранение и регистрация событий, данных датчиков  
  \item системы управления контентом
  \item системы управления документооборотом
  \item мобильные приложения  
\end{itemize}
\end{frame}


\begin{frame}[fragile]
\frametitle{Пример работы с БД в среде Python}
Импорт библиотеки для работы с сервером \emphb{MongoDB}
\begin{minted}{python}
import pymongo 
\end{minted}
Создание соединения для подключения к серверу, требующему авторизацию по имени и паролю 
\begin{minted}{python}
connection_string = "mongodb://имя:пароль@127.0.0.1:27017/university"
cl=pymongo.MongoClient(connection_string)
\end{minted}
Выбор базы \emphb{university}
\begin{minted}{python}
mydb = cl["university"]
\end{minted}
Выбор или создание коллекции \emphb{students}
\begin{minted}{python}
students = mydb["students"]
\end{minted}
\emph{Коллекция} это аналог таблицы в реляционных БД, но в таблицах хранятся строки, а коллекции -- \alert{документы}
\end{frame}

\begin{frame}[fragile]
\frametitle{Добавление документа в коллекцию}
Добавление документа в коллекцию \emphb{students} при помощи функции \emphb{insert\_one}:
\begin{minted}{python}
s1 = { "name": "Садовский", "id": 100 }
x  = students.insert_one(s1)
\end{minted}
Документ представлен стандартным Python-типом \emph{cловарь} и представляет собой множество пар ключ-значение. JSON-представление вставляемой записи (документа): 
\begin{minted}{json}
{ 
    "name": "Садовский", 
    "id": 100 
}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Поиск документа}
Для поиска элемента с заданным значением атрибута используется функция \emphb{find\_one}, например с \emphb{id} = 101
\begin{minted}{python}
students.find_one({"id": 100})
\end{minted}
Результат работы функции \emphb{find\_one()}
\begin{minted}{python}
{
'_id' : ObjectId('5ec81f542268add97efa1e20'), 
'name': 'Садовский', 
'id'  : 100
}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Уникальный идентификатор \emphb{\_id}}
\begin{itemize}
  \item Записанный в коллекцию документ имеет автоматически создаваемое поле \alert{\_id}, которому автоматически присваивается уникальное значение
\begin{minted}{python}
 {
  '_id' : ObjectId('5ec81f542268add97efa1e20'), 
  'name': 'Садовский', 
  'id'  : 100
 }
\end{minted}    
  \item \alert{\_id} -- это \emphb{главный ключ} записи в коллекции
  \item \alert{\_id} -- глобально уникален
  \item значение \alert{\_id} определяется временем его создания (первые 4 байта -- время в секундах с unix-эпохи), идентификатором машины, процесса и некоторого счетчика, начинающегося со случайного начального значения
\end{itemize}  
\end{frame}

\begin{frame}[fragile]
\frametitle{Добавление документа в коллекцию}
Добавление документа в коллекцию \emphb{students} при помощи функции \emphb{insert\_one}:
\begin{minted}{python}
s2 = { "name": "Лопотухин", "id": 101 }
students.insert_one(s2)
\end{minted}
Вывести все объекты в коллекции: 
\begin{minted}{python}
for x in students.find():
  print(x)
\end{minted}
Результат
\begin{minted}{python}
{
'_id': ObjectId('5ec81f542268add97efa1e20'), 
'name': 'Садовский', 
'id': 100
}
{
'_id': ObjectId('5ec81fdf2268add97efa1e21'), 
'name': 'Лопотухин', 
'id': 101
}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Добавление документа в коллекцию}
Вывод значения только одного атрибута "name":
\begin{minted}{python}
for x in students.find({},{"_id": 0, "name": 1}):
    print(x) 
\end{minted}
Результат 
\begin{minted}{python}
{'name': 'Садовский'}
{'name': 'Лопотухин'}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Изменение атрибута}
Изменение атрибута "name" при помощи функции \emphb{update\_one}:
\begin{minted}{python}
myquery = { "name": "Лопотухин" }
newval  = { "$set": { "name": "Лопотухин Василий" } }
students.update_one(myquery, newval)
\end{minted}
Результат 
\begin{minted}{python}
for x in students.find():
    print(x) 

{
  '_id': ObjectId('5ec81f542268add97efa1e20'), 
  'name': 'Садовский', 
  'id': 100
}
{
  '_id': ObjectId('5ec81fdf2268add97efa1e21'), 
  'name': 'Лопотухин Василий', 
  'id': 101
}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Добавление составного атрибута}
Добавление нового составного атрибута:
\begin{minted}{python}
myquery = { "name": "Садовский" }
newval  = { "$set": { "superviser": {"name":"Громов В. И.","position":"Профессор"} } }
students.update_one(myquery, newval)
\end{minted}
Результат 
\begin{minted}{python}
students.find_one({"name": "Садовский"})

{
 '_id' : ObjectId('5ec91a2c2268add97efa1e27'),
 'name': 'Садовский',
 'id': 100,
 'superviser': 
    {
    'name': 'Громов В. И.', 
    'position': 'Профессор'
    }
}
\end{minted}
\end{frame}


\begin{frame}[fragile]
\frametitle{Добавление элемента массива}
Добавление нового элемента к атрибуту-массиву
\begin{minted}{python}
myquery = { "name": "Садовский" }
# Первый элемент массива
newval  = { "$push": { "exam": 
                      {
                        "name": "Базы данных", 
                        "date": "2020-06-20", 
                        "mark": 5
                      } 
                     } 
          }
students.update_one(myquery, newval)
# Второй элемент массива
newval  = { "$push": { "exam": 
                      {
                        "name": "Эконометрика", 
                        "date": "2020-06-25", 
                        "mark": 5
                      } 
                     }
          }          
students.update_one(myquery, newval)
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Добавление элемента массива}
Результат
\begin{minted}{python}
students.find_one({"name": "Садовский"})

{
  '_id': ObjectId('5ec91c332268add97efa1e33'),
  'name': 'Садовский',
  'id': 100,
  'superviser': 
    {
      'name': 'Громов В. И.', 
      'position': 'Профессор'
    },
  'exam': 
    [
    {'name': 'Базы данных', 'date': '2020-06-20', 'mark': 5},
    {'name': 'Эконометрика', 'date': '2020-06-25', 'mark': 5}
    ]
}
\end{minted}
\end{frame}

\begin{frame}[fragile]
\frametitle{Поиск документа}
Найти студентов получивших оценку больше 4 и вывести имя и наименование экзамена
\begin{minted}{python}
c = students.find({"exam.mark": { '$gt': 4}}, 
                  {'_id':0, 'name':1, 'exam.name': 1})
for x in c:
    print(x) 

{
  'name': 'Садовский', 
  'exam':
      [
      {'name': 'Базы данных'}, 
      {'name': 'Эконометрика'}
      ]
}    
\end{minted}
\end{frame}


\frame[plain]{
\frametitle{Список использованных источников 1/2}
\small
\begin{itemize}
  \item Кузнецов С. Д., Посконин А. В. Распределенные горизонтально масштабируемые решения для управления данными // Труды ИСП РАН. 2013 \\
  {\tiny \url{https://cyberleninka.ru/article/n/raspredelennye-gorizontalno-masshtabiruemye-resheniya-dlya-upravleniya-dannymi}}  
  \item Что такое Big data: собрали всё самое важное о больших данных \\
  {\tiny \url{https://rb.ru/howto/chto-takoe-big-data/}}  
  \item Big Data \\
  {\tiny \url{https://www.it.ua/ru/knowledge-base/technology-innovation/big-data-bolshie-dannye}}    
  \item Big Data. What it is and why it matters \\
  {\tiny \url{https://www.sas.com/en_us/insights/big-data/what-is-big-data.html}}    
\end{itemize} 
}


\frame[plain]{
  \frametitle{Список использованных источников 2/2}
\small
\begin{itemize}
  \item Консистентность и ACID-гарантии в распределенных системах хранения данных \\
  {\tiny \url{https://habr.com/ru/company/gridgain/blog/430852/}}
  \item REDIS Documentation \\
  {\tiny \url{https://redis.io/documentation}}
  \item MongoDB Guides \\
  {\tiny \url{https://docs.mongodb.com/guides/}}
\end{itemize} 
}


\frame[plain,c]{
  \begin{center}
  \qrcode[height=1in]{https://classmech.ru/pages/databases/}\\
  \vspace{2mm}
  {\tiny \url{https://classmech.ru/pages/databases/} }
  \end{center}
}

\end{document}